import openpyxl


class FileAbs:
    rowData = 3  # 元记录保存于第3行
    colDataRows = 1  # 记录总行数保存于第1列
    colDataPostLength = 2  # 基本信息宽度保存于第2列
    colDataContentLength = 3  # 详细记录宽度保存于第3列
    offsetPost = 1+1  # 基本信息偏移量设定为1，加上Excel的坐标转换量1
    offsetContent = offsetPost+2  # 详细记录偏移量设定为2，加上基本信息偏移量

    def __init__(self, file_path):
        self.file = file_path
        self.workbook = openpyxl.load_workbook(self.file)
        self.data = self.workbook['Data']  # 元记录表
        self.post = self.workbook['Post']  # 数据表
        self.nRow = self.data.cell(self.rowData, self.colDataRows).value  # 数据记录数
        self.lPost = self.data.cell(self.rowData, self.colDataPostLength).value  # 基本信息宽度
        self.lContent = self.data.cell(self.rowData, self.colDataContentLength).value  # 详细记录宽度

    # 保存并关闭文件
    def save(self):
        self.workbook.save(self.file)

    # 获取记录数
    def getRow(self):
        return self.nRow

    # 设置记录数
    def setRow(self, row):
        self.nRow = row
        self.data.cell(self.rowData, self.colDataRows).value = row

    # 记录数加1，并返回结果
    def addRow(self):
        row = self.nRow + 1
        self.setRow(row)
        return row

    # 获取概要（Post）数据。不传入行号则返回最后一条记录
    def getPost(self, row=0):
        _row = row if row else self.nRow
        rtn = []
        for i in range(self.lPost):
            rtn.append(self.post.cell(_row, i + self.offsetPost).value)
        return rtn

    # 设置概要（Post）数据。不传入行号则在最后一行后新增添加
    def setPost(self, data, row=0):
        _row = row if row else self.addRow()
        for i in range(self.lPost):
            self.post.cell(_row, i + self.offsetPost).value = data[i]

    # 获取详情（Content）数据，不传入行号则返回最后一行
    def getContent(self, row=0):
        _row = row if row else self.nRow
        rtn = []
        for i in range(self.lContent):
            rtn.append(self.post.cell(_row, i + self.lPost + self.offsetContent).value)
        return rtn

    # 设置详情（Content）数据。必须传入行号
    def setContent(self, data, row):
        for i in range(self.lContent):
            self.post.cell(row, i + self.lPost + self.offsetContent).value = data[i]


class File3DM(FileAbs):
    def __init__(self, file_path):
        super().__init__(file_path)
